-- HAD_SUMMON_POS
-- 判断是否有格子可用于召唤

return function(source, target, rand)
    local idle = {};

    -- 先找出所有已使用的空位
    for pos = 1, GRID_SIZE do
        local grid = DungeonM.getGridByPos(pos);
        repeat
            -- 未被翻开
            if not grid:isOpened() then
                break;
            end

            -- 有奖励
            if grid.bonus then
                -- 未失效的
                if grid.state ~= GRID_STATE_DISABLE then
                    break;
                end

                -- 如果原先是怪物则也不能选
                if grid.monster then
                    break;
                end
            end

            -- 有钥匙
            if grid.has_key then
                break;
            end

            -- 不能是允许刷BOSS层流浪者的位置
            if BossTentM.isTrampPos(grid:getPos()) then
                break;
            end

            -- 不能是被拆毁的排炮或已失效的地板
            if (CommonTrapM.isCannon(grid) or grid.type == GRID_TYPE_ODD_FLOOR)
                and grid.state == GRID_STATE_DISABLE then
                break;
            end

            -- 空格或者失效的格子
            if  grid.type == GRID_TYPE_EMPTY or grid.state == GRID_STATE_DISABLE then
                table.insert(idle, grid:getPos());
            end
        until true;
    end

    if #idle > 0 then
        return true;
    end

    -- 没有使用的空格，则从未翻开的格子中寻找
    for pos = 1, GRID_SIZE do
        local grid = DungeonM.getGridByPos(pos);

        if  not grid:isOpened() and
            grid.type == GRID_TYPE_EMPTY then
            -- 空格或者障碍
            table.insert(idle, grid:getPos());
        end
    end

    if #idle > 0 then
        return true;
    end

    return false;
end